package com.health.ts.utils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.rmi.server.UID;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Created on 2016年7月19日
 * <p>
 * Description 文件创建与下载工具类
 * <p>
 */
public class FileUtil extends org.apache.commons.io.FileUtils {

	/**
	 * 声明日志对象
	 */
	static Logger log = LoggerFactory.getLogger(FileUtil.class);
	/**
	 * 编码方式
	 */
	private static final String ENCODEING = "UTF-8";
	/**
	 * 文件不存在
	 */
	public static final int CONTENT_NOTEXIST = 0;
	/**
	 * 覆盖文件
	 */
	public static final int CONTENT_OVERWRITE = 1;
	/**
	 * 追加文件
	 */
	public static final int CONTENT_APPEND = 2;
	
	private static final int MAX_SIZE=1024 * 5;

	/**
	 * 新建目录 如 c:/fqf Created on 2016年8月5日 .
	 * 
	 * @param folderPath
	 * @return {描述}
	 */
	public static File newFolder(String folderPath) {
		File folder = new File(folderPath);
		if (!folder.exists()) {
			folder.mkdirs();
		} else {
			log.warn("new folder error caused folder exist");
		}
		return folder;
	}

	/**
	 * 新建文件(可用) Created on 2016年8月5日 .
	 * 
	 * @param filePathAndName
	 *            String 文件路径及名称 如c:/fqf.txt
	 * @param fileContent
	 *            String 文件内容
	 * @return {描述}
	 */
	public static File newFile(String filePathAndName, String fileContent) {
		return newFile(filePathAndName, fileContent, CONTENT_NOTEXIST);
	}

	/**
	 * 新建文件 Created on 2016年8月5日 .
	 * 
	 * @param filePathAndName
	 *            全路径
	 * @param fileContent
	 *            写入内容
	 * @param contenttype
	 *            操作类型
	 * @return {描述}
	 */
	public static File newFile(String filePathAndName, String fileContent, int contenttype) {//修改
		File f = new File(filePathAndName);
		try {
			if (f.exists()) {//存在即续写
				if (fileContent != null) {
					 FileWriter writer = new FileWriter(f, true);
			         writer.write(fileContent);
			         writer.close();
				}
			} else {
				File dirs = FileUtil.takeOutFileDir(f);//不存在则新建
				dirs.mkdirs();
				f.createNewFile();
				if (fileContent != null) {
					 FileWriter writer = new FileWriter(f, true);
			         writer.write(fileContent);
			         writer.close();
				}
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		return f;
	}

	/**
	 * 删除文件 Created on 2016年8月5日 .
	 * 
	 * @param filePathAndName
	 *            文件路径及名称 如c:/fqf.txt
	 */
	public static void delFile(String filePathAndName) {
		File file = new File(filePathAndName);
		if (file.exists() && file.isFile()) {
			file.delete();
		} else {
			log.warn("file not exists or path is not file");
		}
	}

	/**
	 * 删除文件 Created on 2016年8月5日 .
	 * 
	 * @param folderPath
	 *            文件目录
	 * @param fileName
	 *            文件名
	 */
	public static void delFile(String folderPath, String fileName) {
		String filepath = getFilePath(folderPath, fileName);
		delFile(filepath);
	}

	/**
	 * 删除文件夹 Created on 2016年8月5日 .
	 * 
	 * @param folderPath
	 * @return {描述}
	 */
	public static boolean delFolder(String folderPath) {
		boolean raturn = delAllFile(folderPath);// 删除完里面所有内容
		File folder = new File(folderPath);
		folder.delete(); // 删除空文件夹
		return raturn;
	}

	/**
	 * 删除文件夹里面的所有文件 Created on 2016年8月5日 .
	 * 
	 * @param folderPath
	 *            String 文件夹路径 如 c:/fqf
	 * @return {描述}
	 */
	public static boolean delAllFile(String folderPath) {
		boolean raturn = true;
		File file = new File(folderPath);
		if (!file.exists()) {
			raturn = false;
		}
		if (!file.isDirectory()) {
			raturn = false;
		}
		String[] tempList = file.list();
		File temp = null;
		for (int i = 0; i < tempList.length; i++) {
			if (folderPath.endsWith(File.separator)) {
				temp = new File(folderPath + tempList[i]);
			} else {
				temp = new File(folderPath + File.separator + tempList[i]);
			}
			if (temp.isFile()) {
				temp.delete();
			}
			if (temp.isDirectory()) {
				raturn = delAllFile(folderPath + File.separator + tempList[i]);// 先删除文件夹里面的文件
				if (raturn) {
					raturn = delFolder(folderPath + File.separator + tempList[i]);// 再删除空文件夹
				}
			}
		}
		return raturn;
	}

	/**
	 * 复制单个文件 Created on 2016年8月5日 .
	 * 
	 * @param oldFilePathAndName
	 *            String 原文件路径 如：c:/fqf.txt
	 * @param newFilePathAndName
	 *            String 复制后路径 如：f:/fqf.txt
	 * @return {描述}
	 */
	public static boolean copyFile(String oldFilePathAndName, String newFilePathAndName) {
		boolean raturn = true;
		InputStream is = null;
		FileOutputStream os = null;
		try {
			int byteread = 0;
			is = new FileInputStream(oldFilePathAndName); // 读入原文件
			os = new FileOutputStream(newFilePathAndName);
			byte[] buffer = new byte[MAX_SIZE];
			while ((byteread = is.read(buffer)) != -1) {
				os.write(buffer, 0, byteread);
			}
			os.close();
			is.close();
		} catch (IOException e) {
			e.printStackTrace();
			raturn = false;
		} finally {
			if (is != null) {
				try {
					is.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
			if (os != null) {
				try {
					os.flush();
					os.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		return raturn;
	}

	/**
	 * 复制整个文件夹内容 Created on 2016年8月5日 .
	 * 
	 * @param oldFolderPath
	 *            String 原文件路径 如：c:/fqf
	 * @param newFolderPath
	 *            String 复制后路径 如：f:/fqf/ff
	 * @return {描述}
	 */
	public static boolean copyFolder(String oldFolderPath, String newFolderPath) {
		boolean raturn = true;
		try {
			(new File(newFolderPath)).mkdirs(); // 如果文件夹不存在 则建立新文件夹
			File a = new File(oldFolderPath);
			String[] file = a.list();
			File temp = null;
			for (int i = 0; i < file.length; i++) {
				if (oldFolderPath.endsWith(File.separator)) {
					temp = new File(oldFolderPath + file[i]);
				} else {
					temp = new File(oldFolderPath + File.separator + file[i]);
				}

				if (temp.isFile()) {
					FileInputStream input = new FileInputStream(temp);
					FileOutputStream output = new FileOutputStream(
							newFolderPath + File.separator + (temp.getName()).toString());
					byte[] b = new byte[MAX_SIZE];
					int len;
					while ((len = input.read(b)) != -1) {
						output.write(b, 0, len);
					}
					output.flush();
					output.close();
					input.close();
				}
				if (temp.isDirectory()) {// 如果是子文件夹
					copyFolder(oldFolderPath + File.separator + file[i], newFolderPath + File.separator + file[i]);
				}
			}
		} catch (Exception e) {
			log.error("复制整个文件夹内容操作出错");
			e.printStackTrace();
			raturn = false;
		}
		return raturn;
	}

	/**
	 * 移动文件到指定目录
	 * 
	 * @param oldFilePathAndName
	 *            String 如：c:/fqf.txt
	 * @param newFilePathAndName
	 *            String 如：d:/fqf.txt
	 */
	public static boolean moveFile(String oldFilePathAndName, String newFilePathAndName) {
		boolean raturn = true;
		raturn = copyFile(oldFilePathAndName, newFilePathAndName);
		if (raturn) {
			delFile(oldFilePathAndName);
		}
		return raturn;
	}

	/**
	 * 移动文件夹到指定目录
	 * 
	 * @param oldFolderPath
	 *            String 如：c:/fqf.txt
	 * @param newFolderPath
	 *            String 如：d:/fqf.txt
	 */
	public static boolean moveFolder(String oldFolderPath, String newFolderPath) {
		boolean raturn = true;
		raturn = copyFolder(oldFolderPath, newFolderPath);
		if (raturn) {
			raturn = delFolder(oldFolderPath);
		}
		return raturn;
	}

	/**
	 * @param folderPath
	 * @param fileName
	 * @return
	 */
	public static String getFilePath(String folderPath, String fileName) {
		return folderPath + File.separator + fileName;
	}

	/**
	 * 从文件名中取出后缀
	 * 
	 * @param fileName
	 * @return
	 */
	public static String takeOutFileExt(String fileName) {
		return org.springframework.util.StringUtils.getFilenameExtension(fileName);
	}

	/**
	 * 从文件名中取出后缀
	 * 
	 * @param fileName
	 * @return
	 */
	public static String takeOutFileExt(File file) {
		return takeOutFileExt(file.getName());
	}

	/**
	 * 从文件路径中取出文件名
	 * 
	 * @param filePathAndName
	 * @return
	 */
	public static String takeOutFileName(String filePathAndName) {
		return org.springframework.util.StringUtils.getFilename(filePathAndName);
	}

	public static String takeOutFileName(File file) {
		String filename = null;
		if (file != null) {
			filename = file.getName();
		}
		return filename;
	}

	/**
	 * 从文件路径中取出目录
	 * 
	 * @param filePathAndName
	 * @return
	 */
	public static String takeOutFileDir(String filePathAndName) {
		if ("/".equals(File.separator)) {
			filePathAndName = filePathAndName.replace("\\", File.separator);
		} else {
			filePathAndName = filePathAndName.replace("/", File.separator);
		}
		int pos = filePathAndName.lastIndexOf(File.separator);
		if (pos > 0) {
			return filePathAndName.substring(0, pos + 1);
		} else {
			return "";
		}
	}

	/**
	 * 获取父目录
	 * Created on 2016年8月5日 .
	 * 
	 * @param myFile
	 * @return {描述}
	 */
	private static File takeOutFileDir(File myFile) {
		return myFile.getParentFile();
	}

	/**
	 * 根据系统日期加 UID 生成上传后保存的文件名 Created on 2016年8月5日 .
	 * 
	 * @param fileExt
	 * @param uid
	 * @return {描述}
	 */
	public static String createFileNameByDateAndUID(String fileExt, String uid) {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
		if (uid == null) {
			uid = new UID().toString().replaceAll(":", "-");
		}
		return new StringBuffer().append(sdf.format(new Date())).append("_").append(uid).append(fileExt).toString();
	}

	/**
	 * 写入并创建文件 Created on 2016年7月19日 .
	 * 
	 * @param value
	 *            写入内容
	 * @param fileCatage
	 *            上级目录
	 * @param fileName
	 *            文件名称
	 */
	public static void writeFile(String value, String fileName) {
		File file = null;
		try {
			file = new File(getResourcePath("download"));
			if (!file.isDirectory()) {
				file.mkdir();
			} else {
				file = new File(getResourcePath("download") + fileName + ".sql");
				if (!file.exists()) {
					file.createNewFile();
					FileOutputStream out = new FileOutputStream(file, true);
					out.write(value.getBytes(ENCODEING));
					out.close();
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public static void writeDirectoryFile(String value, String path) {
		File file = null;
		try {
			file = new File(path);
			if (file.exists()) {
				file.createNewFile();
				FileOutputStream out = new FileOutputStream(file, true);
				out.write(value.getBytes(ENCODEING));
				out.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	/**
	 * 在指定目录下创建文件 Created on 2016年7月29日 .
	 * 
	 * @param path
	 *            二级目录名称
	 * @param fileName
	 *            {描述}
	 */
	public static String createDirectoryAndFile(String path, String fileName) {
		File file = new File(path, fileName + ".sql");
		if (!file.exists()) {
			file.getParentFile().mkdirs();
			try {
				file.createNewFile(); // 创建新文件
			} catch (IOException e) {
				log.info("创建新文件时出现了错误。。。");
			}
		}
		return file.getPath();
	}

	/**
	 * 根据文件名删除文件 Created on 2016年7月19日 .
	 * 
	 * @param fileName
	 * @return {描述}
	 */
	public static boolean deleteFile(String filePath) {
		filePath = filePath.replace("/", "\\");
		File file = new File(filePath);
		// 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
		if (file.exists() && file.isFile()) {
			if (file.delete()) {
				log.info("删除单个文件" + filePath + "成功！");
				return true;
			} else {
				log.info("删除单个文件" + filePath + "失败！");
				return false;
			}
		} else {
			log.info("删除单个文件失败：" + filePath + "不存在！");
			return false;
		}
	}

	/**
	 * 获取文件保存新路径,根据操作系统进行路径切分 下载文件缓存路径(download) Created on 2016年6月29日 .
	 * 
	 * @param pathName
	 *            目录名称
	 * @return String
	 */
	public static String getResourcePath(String pathName) {
		String path = Thread.currentThread().getContextClassLoader().getResource("").toString();
		String osName = System.getProperty("os.name");
		if (osName.contains("Win")) {
			if (path.contains("classes")) {
				path = path.replaceFirst("/", "").replace("classes/", "");
			}
			path = path.replace("/", "\\");
			path = path + pathName + File.separator;
			path = path.replace("file:", "");
		} else if (osName.contains("Linux")) {
			if (path.contains("classes")) {
				path = path.replace("classes/", "");
			}
			path = path + pathName + File.separator;
		}
		return path;
	}

	/**
	 * 创建文件路径 Created on 2016年7月29日 .
	 * 
	 * @param path
	 * @return
	 * @throws Exception
	 *             {描述}
	 */
	public static String createDirectory(String path) throws Exception {
		String returnPath = null;
		try {
			File f = new File(FileUtil.getResourcePath("download") + path); // 获得文件对象
			returnPath = f.getPath();
			if (!f.exists()) {
				// 如果路径不存在,则创建
				f.mkdirs();
			}
		} catch (Exception e) {
			log.error("创建目录错误.path=" + path, e);
			throw e;
		}
		return returnPath;
	}

	/**
	 * 测试文件生成(OK) Created on 2016年7月19日 .
	 * 
	 * @param args
	 *            {描述}
	 * @throws Exception
	 */
	
	 public static void main(String[] args) throws Exception {
	  //FileUtil.newFolder(FileUtil.getResourcePath("download")+"test");//创建test
	  //FileUtil.newFolder(FileUtil.getResourcePath("download")+"test/yyy");//在test下创建yyy文件夹
	  //FileUtil.newFile(FileUtil.getResourcePath("download")+"test/yyyy/126.sql", "995666");//创建或者续写文件,全路径创建
	  //FileUtil.delAllFile(FileUtil.getResourcePath("download")+"test/yyy");删除文件夹下的所有内容
		//FileUtil.delFolder(FileUtil.getResourcePath("download")+"test/yyy");//删除文件夹
		 FileUtil.deleteFile("E:/upload/\4b48c2774fe94996b2bcd940c16bf7c9\1.问题.xlsx");
	 }
	 

}
